//***************************************************************************//
//* 版权所有  www.sh-easy.com
//*
//*	
//* 当前版本：V1.0		
//* 作    者：zhfayuan
//* 完成日期：2015-12-26
//**************************************************************************//
#ifndef _SDDUALQUEUE_
#define _SDDUALQUEUE_

#include "SDQueue.h"


//双队列类型定义
typedef struct
{
    QueId ChannelComFreeId;
    QueId ChannelComFullId;
    int iTotalPackNumber;
    int iPackInFreeCount;
    unsigned char * pucBufBase;

}T_DualQue, *DualQueId;



/**************************************************************************
* 函数名称：CreateDualQueue
* 功能描述：创建双队列
* 输入参数：uiPackNumber    队列中包的总数
*			uiPackSize		队列中包的大小	
* 输出参数：
* 返 回 值：DualQueId     创建的双队列句柄，可以提供后续调用
                          
* 其它说明：
* 修改日期     
* -----------------------------------------------
* 2013-12-26	     V1.0	    zhfayuan      
**************************************************************************/
DualQueId CreateDualQueue(int iPackNumber, int iPackSize, bool bBlock = true, int nDelayPacketsFirst = 0);


/**************************************************************************
* 函数名称：DeleteDualQueue
* 功能描述：释放双队列
* 输入参数：pptDualQueId  队列句柄的指针
* 输出参数：无 
* 返 回 值：                             
* 其它说明： 
* 修改日期     
* -----------------------------------------------
* 2013-12-26	     V1.0	    zhfayuan      
**************************************************************************/
int DeleteDualQueue(DualQueId *pptDualQueId);


/**************************************************************************
* 函数名称：PutFullPack
* 功能描述：放入满包
* 输入参数：
* 输出参数：无 
* 返 回 值：0-成功 -1失败                           
* 其它说明： 
* 修改日期     
* -----------------------------------------------
* 2013-12-26	     V1.0	    zhfayuan      
**************************************************************************/
int PutFullPack(DualQueId ptDualQueId, void *pvPack);

/**************************************************************************
* 函数名称：GetEmptyPack
* 功能描述：获得空包
* 输入参数：
* 输出参数：无 
* 返 回 值：                           
* 其它说明： 
* 修改日期     
* -----------------------------------------------
* 2013-12-26	     V1.0	    zhfayuan      
**************************************************************************/
void* GetEmptyPack(DualQueId ptDualQueId, UINT unWaitTime = INFINITE);

/**************************************************************************
* 函数名称：GetFullPack
* 功能描述：获得满包
* 输入参数：
* 输出参数：无 
* 返 回 值：                           
* 其它说明： 
* 修改日期     
* -----------------------------------------------
* 2013-12-26	     V1.0	    zhfayuan      
**************************************************************************/
void * GetFullPack(DualQueId ptDualQueId, UINT unWaitTime = INFINITE);

/**************************************************************************
* 函数名称：PutEmptyPack
* 功能描述：放入空包
* 输入参数：
* 输出参数：无 
* 返 回 值：                           
* 其它说明： 
* 修改日期     
* -----------------------------------------------
* 2013-12-26	     V1.0	    zhfayuan      
**************************************************************************/
int PutEmptyPack(DualQueId ptDualQueId, void *pvPack);


/**************************************************************************
* 函数名称：GetFullPack
* 功能描述：获得满包队列第一个元素，但不取出
* 输入参数：
* 输出参数：无
* 返 回 值：
* 其它说明：
* 修改日期
* -----------------------------------------------
* 2013-12-26	     V1.0	    zhfayuan  
**************************************************************************/
void * FrontFullPack(DualQueId ptDualQueId);

bool IsDualQueueEmpty(DualQueId ptDualQueId);

unsigned int CurrentQueueSize(DualQueId ptDualQueId);

//设置初始缓存大小，队列中的包数达到此大小时方能开始输出
void SetInitDualQueueSize(DualQueId ptDualQueId, int nInitQueueSize);
#endif
